package com.meatball.id.base

import org.hibernate.boot.model.naming.Identifier
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment

/**
 * TODO 自定义Hibernate命名策略类
 *
 * @author 张翔宇
 * @since 2024年3月25日
 */
class UpperCaseNamingStrategy : PhysicalNamingStrategyStandardImpl() {
    override fun toPhysicalTableName(logicalName: Identifier?, context: JdbcEnvironment?): Identifier {
        // 将逻辑表名转换为大写
        // logicalName?.text 获取逻辑表名的文本
        // ?.uppercase() 是一个安全调用，如果logicalName或text不为null，则将文本转换为大写
//        val newName  = logicalName?.text?.uppercase()

        // 使用转换后的新表名创建一个Identifier实例并返回
        // Identifier.toIdentifier(newName) 是一个静态方法，用于创建Identifier实例
//        return Identifier.toIdentifier(newName)
        return Identifier.toIdentifier(convertToUpperCase(logicalName))
    }

    override fun toPhysicalColumnName(logicalName: Identifier?, context: JdbcEnvironment?): Identifier {
        return Identifier.toIdentifier(convertToUpperCase(logicalName))
    }

    private fun convertToUpperCase(identifier: Identifier?): String {
        val regex = "([a-z])([A-Z])".toRegex()
        val newName = identifier?.text
            ?.replace(regex, "\$1_\$2") // 将驼峰命名转换为下划线命名
            ?.uppercase() // 转换为大写

        return newName ?: ""
    }
}